{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "891b5e34",
   "metadata": {},
   "outputs": [],
   "source": [
    "import collections\n",
    "\n",
    "import datasets\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.optim as optim\n",
    "import torchtext\n",
    "import tqdm\n",
    "import transformers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "895ef909",
   "metadata": {},
   "outputs": [],
   "source": [
    "seed = 1234\n",
    "\n",
    "np.random.seed(seed)\n",
    "torch.manual_seed(seed)\n",
    "torch.cuda.manual_seed(seed)\n",
    "torch.backends.cudnn.deterministic = True"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "98f4ab7c",
   "metadata": {},
   "outputs": [],
   "source": [
    "train_data, test_data = datasets.load_dataset(\"imdb\", split=[\"train\", \"test\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "d0a1e49f",
   "metadata": {},
   "outputs": [],
   "source": [
    "transformer_name = \"bert-base-uncased\"\n",
    "\n",
    "tokenizer = transformers.AutoTokenizer.from_pretrained(transformer_name)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "4c814ae1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['hello', 'world', '!']"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tokenizer.tokenize(\"hello world!\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "ab3e4c32",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[101, 7592, 2088, 999, 102]"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tokenizer.encode(\"hello world!\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "8f10453a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['[CLS]', 'hello', 'world', '[SEP]']"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tokenizer.convert_ids_to_tokens(tokenizer.encode(\"hello world\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "824ba733",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'input_ids': [101, 7592, 2088, 999, 102], 'token_type_ids': [0, 0, 0, 0, 0], 'attention_mask': [1, 1, 1, 1, 1]}"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tokenizer(\"hello world!\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "9358a7aa",
   "metadata": {},
   "outputs": [],
   "source": [
    "def tokenize_and_numericalize_example(example, tokenizer):\n",
    "    ids = tokenizer(example[\"text\"], truncation=True)[\"input_ids\"]\n",
    "    return {\"ids\": ids}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "d0259875",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "58bc85d9ef1943a0a5985a780818fe79",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Map:   0%|          | 0/25000 [00:00<?, ? examples/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "train_data = train_data.map(\n",
    "    tokenize_and_numericalize_example, fn_kwargs={\"tokenizer\": tokenizer}\n",
    ")\n",
    "test_data = test_data.map(\n",
    "    tokenize_and_numericalize_example, fn_kwargs={\"tokenizer\": tokenizer}\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "e39e64b1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'text': 'I rented I AM CURIOUS-YELLOW from my video store because of all the controversy that surrounded it when it was first released in 1967. I also heard that at first it was seized by U.S. customs if it ever tried to enter this country, therefore being a fan of films considered \"controversial\" I really had to see this for myself.<br /><br />The plot is centered around a young Swedish drama student named Lena who wants to learn everything she can about life. In particular she wants to focus her attentions to making some sort of documentary on what the average Swede thought about certain political issues such as the Vietnam War and race issues in the United States. In between asking politicians and ordinary denizens of Stockholm about their opinions on politics, she has sex with her drama teacher, classmates, and married men.<br /><br />What kills me about I AM CURIOUS-YELLOW is that 40 years ago, this was considered pornographic. Really, the sex and nudity scenes are few and far between, even then it\\'s not shot like some cheaply made porno. While my countrymen mind find it shocking, in reality sex and nudity are a major staple in Swedish cinema. Even Ingmar Bergman, arguably their answer to good old boy John Ford, had sex scenes in his films.<br /><br />I do commend the filmmakers for the fact that any sex shown in the film is shown for artistic purposes rather than just to shock people and make money to be shown in pornographic theaters in America. I AM CURIOUS-YELLOW is a good film for anyone wanting to study the meat and potatoes (no pun intended) of Swedish cinema. But really, this film doesn\\'t have much of a plot.',\n",
       " 'label': 0,\n",
       " 'ids': [101,\n",
       "  1045,\n",
       "  12524,\n",
       "  1045,\n",
       "  2572,\n",
       "  8025,\n",
       "  1011,\n",
       "  3756,\n",
       "  2013,\n",
       "  2026,\n",
       "  2678,\n",
       "  3573,\n",
       "  2138,\n",
       "  1997,\n",
       "  2035,\n",
       "  1996,\n",
       "  6704,\n",
       "  2008,\n",
       "  5129,\n",
       "  2009,\n",
       "  2043,\n",
       "  2009,\n",
       "  2001,\n",
       "  2034,\n",
       "  2207,\n",
       "  1999,\n",
       "  3476,\n",
       "  1012,\n",
       "  1045,\n",
       "  2036,\n",
       "  2657,\n",
       "  2008,\n",
       "  2012,\n",
       "  2034,\n",
       "  2009,\n",
       "  2001,\n",
       "  8243,\n",
       "  2011,\n",
       "  1057,\n",
       "  1012,\n",
       "  1055,\n",
       "  1012,\n",
       "  8205,\n",
       "  2065,\n",
       "  2009,\n",
       "  2412,\n",
       "  2699,\n",
       "  2000,\n",
       "  4607,\n",
       "  2023,\n",
       "  2406,\n",
       "  1010,\n",
       "  3568,\n",
       "  2108,\n",
       "  1037,\n",
       "  5470,\n",
       "  1997,\n",
       "  3152,\n",
       "  2641,\n",
       "  1000,\n",
       "  6801,\n",
       "  1000,\n",
       "  1045,\n",
       "  2428,\n",
       "  2018,\n",
       "  2000,\n",
       "  2156,\n",
       "  2023,\n",
       "  2005,\n",
       "  2870,\n",
       "  1012,\n",
       "  1026,\n",
       "  7987,\n",
       "  1013,\n",
       "  1028,\n",
       "  1026,\n",
       "  7987,\n",
       "  1013,\n",
       "  1028,\n",
       "  1996,\n",
       "  5436,\n",
       "  2003,\n",
       "  8857,\n",
       "  2105,\n",
       "  1037,\n",
       "  2402,\n",
       "  4467,\n",
       "  3689,\n",
       "  3076,\n",
       "  2315,\n",
       "  14229,\n",
       "  2040,\n",
       "  4122,\n",
       "  2000,\n",
       "  4553,\n",
       "  2673,\n",
       "  2016,\n",
       "  2064,\n",
       "  2055,\n",
       "  2166,\n",
       "  1012,\n",
       "  1999,\n",
       "  3327,\n",
       "  2016,\n",
       "  4122,\n",
       "  2000,\n",
       "  3579,\n",
       "  2014,\n",
       "  3086,\n",
       "  2015,\n",
       "  2000,\n",
       "  2437,\n",
       "  2070,\n",
       "  4066,\n",
       "  1997,\n",
       "  4516,\n",
       "  2006,\n",
       "  2054,\n",
       "  1996,\n",
       "  2779,\n",
       "  25430,\n",
       "  14728,\n",
       "  2245,\n",
       "  2055,\n",
       "  3056,\n",
       "  2576,\n",
       "  3314,\n",
       "  2107,\n",
       "  2004,\n",
       "  1996,\n",
       "  5148,\n",
       "  2162,\n",
       "  1998,\n",
       "  2679,\n",
       "  3314,\n",
       "  1999,\n",
       "  1996,\n",
       "  2142,\n",
       "  2163,\n",
       "  1012,\n",
       "  1999,\n",
       "  2090,\n",
       "  4851,\n",
       "  8801,\n",
       "  1998,\n",
       "  6623,\n",
       "  7939,\n",
       "  4697,\n",
       "  3619,\n",
       "  1997,\n",
       "  8947,\n",
       "  2055,\n",
       "  2037,\n",
       "  10740,\n",
       "  2006,\n",
       "  4331,\n",
       "  1010,\n",
       "  2016,\n",
       "  2038,\n",
       "  3348,\n",
       "  2007,\n",
       "  2014,\n",
       "  3689,\n",
       "  3836,\n",
       "  1010,\n",
       "  19846,\n",
       "  1010,\n",
       "  1998,\n",
       "  2496,\n",
       "  2273,\n",
       "  1012,\n",
       "  1026,\n",
       "  7987,\n",
       "  1013,\n",
       "  1028,\n",
       "  1026,\n",
       "  7987,\n",
       "  1013,\n",
       "  1028,\n",
       "  2054,\n",
       "  8563,\n",
       "  2033,\n",
       "  2055,\n",
       "  1045,\n",
       "  2572,\n",
       "  8025,\n",
       "  1011,\n",
       "  3756,\n",
       "  2003,\n",
       "  2008,\n",
       "  2871,\n",
       "  2086,\n",
       "  3283,\n",
       "  1010,\n",
       "  2023,\n",
       "  2001,\n",
       "  2641,\n",
       "  26932,\n",
       "  1012,\n",
       "  2428,\n",
       "  1010,\n",
       "  1996,\n",
       "  3348,\n",
       "  1998,\n",
       "  16371,\n",
       "  25469,\n",
       "  5019,\n",
       "  2024,\n",
       "  2261,\n",
       "  1998,\n",
       "  2521,\n",
       "  2090,\n",
       "  1010,\n",
       "  2130,\n",
       "  2059,\n",
       "  2009,\n",
       "  1005,\n",
       "  1055,\n",
       "  2025,\n",
       "  2915,\n",
       "  2066,\n",
       "  2070,\n",
       "  10036,\n",
       "  2135,\n",
       "  2081,\n",
       "  22555,\n",
       "  2080,\n",
       "  1012,\n",
       "  2096,\n",
       "  2026,\n",
       "  2406,\n",
       "  3549,\n",
       "  2568,\n",
       "  2424,\n",
       "  2009,\n",
       "  16880,\n",
       "  1010,\n",
       "  1999,\n",
       "  4507,\n",
       "  3348,\n",
       "  1998,\n",
       "  16371,\n",
       "  25469,\n",
       "  2024,\n",
       "  1037,\n",
       "  2350,\n",
       "  18785,\n",
       "  1999,\n",
       "  4467,\n",
       "  5988,\n",
       "  1012,\n",
       "  2130,\n",
       "  13749,\n",
       "  7849,\n",
       "  24544,\n",
       "  1010,\n",
       "  15835,\n",
       "  2037,\n",
       "  3437,\n",
       "  2000,\n",
       "  2204,\n",
       "  2214,\n",
       "  2879,\n",
       "  2198,\n",
       "  4811,\n",
       "  1010,\n",
       "  2018,\n",
       "  3348,\n",
       "  5019,\n",
       "  1999,\n",
       "  2010,\n",
       "  3152,\n",
       "  1012,\n",
       "  1026,\n",
       "  7987,\n",
       "  1013,\n",
       "  1028,\n",
       "  1026,\n",
       "  7987,\n",
       "  1013,\n",
       "  1028,\n",
       "  1045,\n",
       "  2079,\n",
       "  4012,\n",
       "  3549,\n",
       "  2094,\n",
       "  1996,\n",
       "  16587,\n",
       "  2005,\n",
       "  1996,\n",
       "  2755,\n",
       "  2008,\n",
       "  2151,\n",
       "  3348,\n",
       "  3491,\n",
       "  1999,\n",
       "  1996,\n",
       "  2143,\n",
       "  2003,\n",
       "  3491,\n",
       "  2005,\n",
       "  6018,\n",
       "  5682,\n",
       "  2738,\n",
       "  2084,\n",
       "  2074,\n",
       "  2000,\n",
       "  5213,\n",
       "  2111,\n",
       "  1998,\n",
       "  2191,\n",
       "  2769,\n",
       "  2000,\n",
       "  2022,\n",
       "  3491,\n",
       "  1999,\n",
       "  26932,\n",
       "  12370,\n",
       "  1999,\n",
       "  2637,\n",
       "  1012,\n",
       "  1045,\n",
       "  2572,\n",
       "  8025,\n",
       "  1011,\n",
       "  3756,\n",
       "  2003,\n",
       "  1037,\n",
       "  2204,\n",
       "  2143,\n",
       "  2005,\n",
       "  3087,\n",
       "  5782,\n",
       "  2000,\n",
       "  2817,\n",
       "  1996,\n",
       "  6240,\n",
       "  1998,\n",
       "  14629,\n",
       "  1006,\n",
       "  2053,\n",
       "  26136,\n",
       "  3832,\n",
       "  1007,\n",
       "  1997,\n",
       "  4467,\n",
       "  5988,\n",
       "  1012,\n",
       "  2021,\n",
       "  2428,\n",
       "  1010,\n",
       "  2023,\n",
       "  2143,\n",
       "  2987,\n",
       "  1005,\n",
       "  1056,\n",
       "  2031,\n",
       "  2172,\n",
       "  1997,\n",
       "  1037,\n",
       "  5436,\n",
       "  1012,\n",
       "  102]}"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "96d87205",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "999"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tokenizer.vocab[\"!\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "614d747b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'[PAD]'"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tokenizer.pad_token"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "18f18b66",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tokenizer.pad_token_id"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "2a0d0a6d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tokenizer.vocab[tokenizer.pad_token]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "3cdaa10f",
   "metadata": {},
   "outputs": [],
   "source": [
    "pad_index = tokenizer.pad_token_id"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "8532b705",
   "metadata": {},
   "outputs": [],
   "source": [
    "test_size = 0.25\n",
    "\n",
    "train_valid_data = train_data.train_test_split(test_size=test_size)\n",
    "train_data = train_valid_data[\"train\"]\n",
    "valid_data = train_valid_data[\"test\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "cc54e1eb",
   "metadata": {},
   "outputs": [],
   "source": [
    "train_data = train_data.with_format(type=\"torch\", columns=[\"ids\", \"label\"])\n",
    "valid_data = valid_data.with_format(type=\"torch\", columns=[\"ids\", \"label\"])\n",
    "test_data = test_data.with_format(type=\"torch\", columns=[\"ids\", \"label\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "bea43ba0",
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_collate_fn(pad_index):\n",
    "    def collate_fn(batch):\n",
    "        batch_ids = [i[\"ids\"] for i in batch]\n",
    "        batch_ids = nn.utils.rnn.pad_sequence(\n",
    "            batch_ids, padding_value=pad_index, batch_first=True\n",
    "        )\n",
    "        batch_label = [i[\"label\"] for i in batch]\n",
    "        batch_label = torch.stack(batch_label)\n",
    "        batch = {\"ids\": batch_ids, \"label\": batch_label}\n",
    "        return batch\n",
    "\n",
    "    return collate_fn"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "ea2176bb",
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_data_loader(dataset, batch_size, pad_index, shuffle=False):\n",
    "    collate_fn = get_collate_fn(pad_index)\n",
    "    data_loader = torch.utils.data.DataLoader(\n",
    "        dataset=dataset,\n",
    "        batch_size=batch_size,\n",
    "        collate_fn=collate_fn,\n",
    "        shuffle=shuffle,\n",
    "    )\n",
    "    return data_loader"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "dce162ba",
   "metadata": {},
   "outputs": [],
   "source": [
    "batch_size = 8\n",
    "\n",
    "train_data_loader = get_data_loader(train_data, batch_size, pad_index, shuffle=True)\n",
    "valid_data_loader = get_data_loader(valid_data, batch_size, pad_index)\n",
    "test_data_loader = get_data_loader(test_data, batch_size, pad_index)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "01a637ac",
   "metadata": {},
   "outputs": [],
   "source": [
    "class Transformer(nn.Module):\n",
    "    def __init__(self, transformer, output_dim, freeze):\n",
    "        super().__init__()\n",
    "        self.transformer = transformer\n",
    "        hidden_dim = transformer.config.hidden_size\n",
    "        self.fc = nn.Linear(hidden_dim, output_dim)\n",
    "        if freeze:\n",
    "            for param in self.transformer.parameters():\n",
    "                param.requires_grad = False\n",
    "\n",
    "    def forward(self, ids):\n",
    "        # ids = [batch size, seq len]\n",
    "        output = self.transformer(ids, output_attentions=True)\n",
    "        hidden = output.last_hidden_state\n",
    "        # hidden = [batch size, seq len, hidden dim]\n",
    "        attention = output.attentions[-1]\n",
    "        # attention = [batch size, n heads, seq len, seq len]\n",
    "        cls_hidden = hidden[:, 0, :]\n",
    "        prediction = self.fc(torch.tanh(cls_hidden))\n",
    "        # prediction = [batch size, output dim]\n",
    "        return prediction"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "f057f3b6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n",
      "To disable this warning, you can either:\n",
      "\t- Avoid using `tokenizers` before the fork if possible\n",
      "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n",
      "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n",
      "To disable this warning, you can either:\n",
      "\t- Avoid using `tokenizers` before the fork if possible\n",
      "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n",
      "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n",
      "To disable this warning, you can either:\n",
      "\t- Avoid using `tokenizers` before the fork if possible\n",
      "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n"
     ]
    }
   ],
   "source": [
    "transformer = transformers.AutoModel.from_pretrained(transformer_name)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "e1daf186",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "768"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "transformer.config.hidden_size"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "ff995192",
   "metadata": {},
   "outputs": [],
   "source": [
    "output_dim = len(train_data[\"label\"].unique())\n",
    "freeze = False\n",
    "\n",
    "model = Transformer(transformer, output_dim, freeze)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "f15efc07",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The model has 109,483,778 trainable parameters\n"
     ]
    }
   ],
   "source": [
    "def count_parameters(model):\n",
    "    return sum(p.numel() for p in model.parameters() if p.requires_grad)\n",
    "\n",
    "\n",
    "print(f\"The model has {count_parameters(model):,} trainable parameters\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "d2a9f4f7",
   "metadata": {},
   "outputs": [],
   "source": [
    "lr = 1e-5\n",
    "\n",
    "optimizer = optim.Adam(model.parameters(), lr=lr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "e82c640f",
   "metadata": {},
   "outputs": [],
   "source": [
    "criterion = nn.CrossEntropyLoss()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "0bb2a2a4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "device(type='cuda')"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
    "\n",
    "device"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "6fc62ff8",
   "metadata": {},
   "outputs": [],
   "source": [
    "model = model.to(device)\n",
    "criterion = criterion.to(device)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "98f54638",
   "metadata": {},
   "outputs": [],
   "source": [
    "def train(data_loader, model, criterion, optimizer, device):\n",
    "    model.train()\n",
    "    epoch_losses = []\n",
    "    epoch_accs = []\n",
    "    for batch in tqdm.tqdm(data_loader, desc=\"training...\"):\n",
    "        ids = batch[\"ids\"].to(device)\n",
    "        label = batch[\"label\"].to(device)\n",
    "        prediction = model(ids)\n",
    "        loss = criterion(prediction, label)\n",
    "        accuracy = get_accuracy(prediction, label)\n",
    "        optimizer.zero_grad()\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "        epoch_losses.append(loss.item())\n",
    "        epoch_accs.append(accuracy.item())\n",
    "    return np.mean(epoch_losses), np.mean(epoch_accs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "df0424bd",
   "metadata": {},
   "outputs": [],
   "source": [
    "def evaluate(data_loader, model, criterion, device):\n",
    "    model.eval()\n",
    "    epoch_losses = []\n",
    "    epoch_accs = []\n",
    "    with torch.no_grad():\n",
    "        for batch in tqdm.tqdm(data_loader, desc=\"evaluating...\"):\n",
    "            ids = batch[\"ids\"].to(device)\n",
    "            label = batch[\"label\"].to(device)\n",
    "            prediction = model(ids)\n",
    "            loss = criterion(prediction, label)\n",
    "            accuracy = get_accuracy(prediction, label)\n",
    "            epoch_losses.append(loss.item())\n",
    "            epoch_accs.append(accuracy.item())\n",
    "    return np.mean(epoch_losses), np.mean(epoch_accs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "34331854",
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_accuracy(prediction, label):\n",
    "    batch_size, _ = prediction.shape\n",
    "    predicted_classes = prediction.argmax(dim=-1)\n",
    "    correct_predictions = predicted_classes.eq(label).sum()\n",
    "    accuracy = correct_predictions / batch_size\n",
    "    return accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "df33ac5d",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "training...:   0%|                                     | 0/2344 [00:00<?, ?it/s]We strongly recommend passing in an `attention_mask` since your input_ids may be padded. See https://huggingface.co/docs/transformers/troubleshooting#incorrect-output-when-padding-tokens-arent-masked.\n",
      "training...: 100%|██████████████████████████| 2344/2344 [08:08<00:00,  4.80it/s]\n",
      "evaluating...: 100%|██████████████████████████| 782/782 [00:54<00:00, 14.38it/s]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch: 0\n",
      "train_loss: 0.261, train_acc: 0.885\n",
      "valid_loss: 0.189, valid_acc: 0.927\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "training...: 100%|██████████████████████████| 2344/2344 [08:12<00:00,  4.76it/s]\n",
      "evaluating...: 100%|██████████████████████████| 782/782 [00:52<00:00, 14.80it/s]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch: 1\n",
      "train_loss: 0.130, train_acc: 0.953\n",
      "valid_loss: 0.222, valid_acc: 0.922\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "training...: 100%|██████████████████████████| 2344/2344 [08:10<00:00,  4.78it/s]\n",
      "evaluating...: 100%|██████████████████████████| 782/782 [00:52<00:00, 14.92it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch: 2\n",
      "train_loss: 0.067, train_acc: 0.980\n",
      "valid_loss: 0.249, valid_acc: 0.930\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "n_epochs = 3\n",
    "best_valid_loss = float(\"inf\")\n",
    "\n",
    "metrics = collections.defaultdict(list)\n",
    "\n",
    "for epoch in range(n_epochs):\n",
    "    train_loss, train_acc = train(\n",
    "        train_data_loader, model, criterion, optimizer, device\n",
    "    )\n",
    "    valid_loss, valid_acc = evaluate(valid_data_loader, model, criterion, device)\n",
    "    metrics[\"train_losses\"].append(train_loss)\n",
    "    metrics[\"train_accs\"].append(train_acc)\n",
    "    metrics[\"valid_losses\"].append(valid_loss)\n",
    "    metrics[\"valid_accs\"].append(valid_acc)\n",
    "    if valid_loss < best_valid_loss:\n",
    "        best_valid_loss = valid_loss\n",
    "        torch.save(model.state_dict(), \"transformer.pt\")\n",
    "    print(f\"epoch: {epoch}\")\n",
    "    print(f\"train_loss: {train_loss:.3f}, train_acc: {train_acc:.3f}\")\n",
    "    print(f\"valid_loss: {valid_loss:.3f}, valid_acc: {valid_acc:.3f}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "8ac2a935",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure(figsize=(10, 6))\n",
    "ax = fig.add_subplot(1, 1, 1)\n",
    "ax.plot(metrics[\"train_losses\"], label=\"train loss\")\n",
    "ax.plot(metrics[\"valid_losses\"], label=\"valid loss\")\n",
    "ax.set_xlabel(\"epoch\")\n",
    "ax.set_ylabel(\"loss\")\n",
    "ax.set_xticks(range(n_epochs))\n",
    "ax.legend()\n",
    "ax.grid()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "8796527d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1cAAAINCAYAAADSoIXVAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABv6UlEQVR4nO3dd3hUddrG8XtmUiY9hIQkQBAISA0ESEBEsYFI0FV37bqQoLgWXBVdX7CLrrhFxIJ1BRT7qqgrRRAFFUFC09B7EVIp6WUyc94/AkMCAZKQcCbJ93NducKcNs+ZDCdz51eOxTAMQwAAAACA02I1uwAAAAAAaAoIVwAAAABQDwhXAAAAAFAPCFcAAAAAUA8IVwAAAABQDwhXAAAAAFAPCFcAAAAAUA8IVwAAAABQD7zMLsATuVwu7du3T0FBQbJYLGaXAwAAAMAkhmEoPz9frVu3ltV68rYpwlU19u3bp5iYGLPLAAAAAOAh9uzZo7Zt2550G8JVNYKCgiRVvIDBwcGm1uJwODR//nxdeuml8vb2NrUWAGhuuAYDgDk86fqbl5enmJgYd0Y4GcJVNY50BQwODvaIcOXv76/g4GDT31gA0NxwDQYAc3ji9bcmw4WY0AIAAAAA6gHhCgAAAADqAeEKAAAAAOoBY67qyDAMlZeXy+l0NujzOBwOeXl5qaSkpMGfC+ax2Wzy8vJi6n8AAIBGjHBVB2VlZUpPT1dRUVGDP5dhGIqKitKePXv44N3E+fv7Kzo6Wj4+PmaXAgAAgDogXNWSy+XSjh07ZLPZ1Lp1a/n4+DRo6HG5XCooKFBgYOApb1qGxskwDJWVlSk7O1s7duxQ586d+VkDAAA0QoSrWiorK5PL5VJMTIz8/f0b/PlcLpfKyspkt9v5wN2E+fn5ydvbW7t27XL/vAEAANC48Gm9jgg6qG+8pwAAABo3Ps0BAAAAQD0gXKHO2rdvrylTpphdBgAAAOARGHPVjFx44YWKj4+vt0CUmpqqgICAejkWAAAA0NiZ3nI1depUtW/fXna7XQMGDNDy5ctPuK3D4dDEiRMVGxsru92u3r17a968eVW2cTqdeuyxx9ShQwf5+fkpNjZWTz/9tAzDaOhTaRKO3L+rJiIiIs7IpB5nUm3OHwAAAKjM1HD18ccfa9y4cXriiSe0atUq9e7dW8OGDVNWVla12z/66KN644039PLLL2v9+vW64447dPXVV2v16tXubf7xj3/otdde0yuvvKINGzboH//4h/75z3/q5ZdfPlOn5ZGSk5O1ePFivfjii7JYLLJYLNq5c6cWLVoki8WiuXPnql+/fvL19dVPP/2kbdu26corr1RkZKQCAwOVmJiob7/9tsoxj+0WaLFY9J///EdXX321/P391blzZ3311VcnrWvmzJlKSEhQUFCQoqKidNNNNx3381+3bp0uv/xyBQcHKygoSOeff762bdvmXj9t2jT16NFDvr6+io6O1tixYyVJO3fulMVi0Zo1a9zbHjp0SBaLRYsWLZKk0zr/0tJS/d///Z9iYmLk6+urTp066e2335ZhGOrUqZP+/e9/V9l+zZo1slgs2rp160lfEwAAADROpoaryZMna8yYMUpJSVH37t31+uuvy9/fX9OmTat2+5kzZ+rhhx9WUlKSOnbsqDvvvFNJSUl6/vnn3dv8/PPPuvLKKzVixAi1b99e11xzjS699NKTtoidLsMwVFRW3mBfxWXOapfXpjXuxRdf1MCBAzVmzBilp6crPT1dMTEx7vXjx4/Xc889pw0bNqhXr14qKChQUlKSFi5cqNWrV+uyyy7TFVdcod27d5/0eZ566ildd911+u2335SUlKSbb75ZBw4cOOH2DodDTz/9tH799Vd98cUX2rlzp5KTk93r9+7dq8GDB8vX11ffffedVq5cqdGjR7tbl1577TXdfffduv3225WWlqavvvpKnTp1qvHrcjrnP3LkSH344Yd66aWXtGHDBr3xxhsKDAyUxWLR6NGjNX369CrPMX36dA0ePLhO9QEAAMDzmTbmqqysTCtXrtSECRPcy6xWq4YMGaKlS5dWu09paelx9//x8/PTTz/95H587rnn6s0339TmzZt19tln69dff9VPP/2kyZMnN8yJSCp2ONX98W8a7Pgnsn7iMPn71OxHGBISIh8fH/n7+ysqKuq49RMnTtTQoUPdj8PCwtS7d2/346efflqzZs3SV1995W4Zqk5ycrJuvPFGSdKzzz6rl156ScuXL9dll11W7fajR492/7tjx4566aWXlJiY6L5x8tSpUxUSEqKPPvpI3t7ekqSzzz7bvc8zzzyjBx54QPfee697WWJi4qlejuPU9vw3b96sTz75RAsWLNCQIUPc9Vd+HR5//HEtX75c/fv3l8Ph0AcffHBcaxYAAACaDtPCVU5OjpxOpyIjI6ssj4yM1MaNG6vdZ9iwYZo8ebIGDx6s2NhYLVy4UJ9//rmcTqd7m/HjxysvL09du3aVzWaT0+nU3//+d918880nrKW0tFSlpaXux3l5eZIqWlUcDkeVbR0OhwzDkMvlksvlkiT39zOtcg01daT2yseQpL59+1ZZXlBQoKeeekpz5sxRenq6ysvLVVxcrF27dlXZ7tjj9ezZ0/3Yz89PwcHBysjIOGGdK1eu1FNPPaXffvtNBw8edG+3c+dOde/eXatXr9Z5550nm8123DGysrK0b98+XXTRRdUev/LP59if1ZFldT3/VatWyWaz6fzzz6/2uaOiopSUlKS3335bCQkJ+vLLL1VaWqo//elPJ3wtXC6XDMOQw+GQzWardhsAZ9aR3wHH/i4AADQsT7r+1qaGRjVb4IsvvqgxY8aoa9euslgsio2NVUpKSpVuhJ988onef/99ffDBB+rRo4fWrFmj++67T61bt9aoUaOqPe6kSZP01FNPHbd8/vz5x03Y4OXlpaioKBUUFKisrExSRcBYOu6cejzTmnEUFyqvxFLj7cvLy1VWVuYOj5JUVFQkqeKDfeXl999/vxYtWqSnn37aPTnIqFGjVFBQ4N7O5XKppKSkyn7l5eVVHh95jmOXSVJhYaEuu+wyXXzxxXr99dcVHh6u33//XX/605908OBB5eXlydvbWw6Ho9r9j7zRT3Z8SVVqPtJF8cg+dT3/I10yj9RYnRtvvFF33HGHnnzySfdYtOpenyPKyspUXFysH374gUk1AA+zYMECs0sAgGbDZUg78qWDpRbJA66/Rz4v1oRp4So8PFw2m02ZmZlVlmdmZlbbbU2qmJ3uiy++UElJifbv36/WrVtr/PjxVbpj/e1vf9P48eN1ww03SJLi4uK0a9cuTZo06YThasKECRo3bpz7cV5enmJiYnTppZcqODi4yrYlJSXas2ePAgMDq3RRDKnd6deYYRjKz89XUFCQLJaaB6nq+Pn5yWazVTmnI+ExKCioyvIVK1YoJSVFN910k6SKgLJnzx75+Pi4t7NarbLb7VX2O9JadYTFYjlumyO2bNmiAwcO6N///rd7/NeRVsuAgAAFBwerb9++evfdd+Xn53dciAkODlb79u21bNkyjRgx4rjjH3lf5OXluZ//l19+cZ93cHBwnc9/wIABcrlcWr16tbtb4LGuueYaPfjgg/rggw+0cOFCLVq0qNrX4YiSkhL5+flp8ODBx3V/BWAOh8OhBQsWaOjQoSf8QwoA4PQ5XYZW7DqoeesyNX99lrLyS+VvM/Tg9RfK3+5ram0n+sN4dUwLVz4+PurXr58WLlyoq666SlJF68HChQtPOqZHkux2u9q0aSOHw6HPPvtM1113nXtdUVGRrNaq83RU16WsMl9fX/n6Hv9D8/b2Pu6XqdPplMVikdVqPe55GsKRuo885+no0KGDli9frt27dyswMFBhYWHuYx57Pp07d9asWbP0hz/8QRaLRY899phcLtdxdRz7uLrX5USvVfv27eXj46OpU6fqjjvu0Nq1a/X3v/+9yj733HOPXnnlFd10002aMGGCQkJCtGzZMvXv319dunTRk08+qTvuuEORkZEaPny48vPztWTJEt1zzz0KCAjQOeeco3/+85+KjY1VVlaWHn/88SrHr+v5d+zYUaNGjdJtt92ml156Sb1799auXbuUlZXlfj9arVYlJyfr4YcfVufOnTVo0KCT/nysVqssFku17zsA5uL/JQDUP6fL0C879mtOWrrmrc1UTsHRYTpBdi91DSpTidOiEJOvv7W5/ps6W+C4ceP01ltv6Z133tGGDRt05513qrCwUCkpKZIqZmOrPOHFL7/8os8//1zbt2/Xjz/+qMsuu0wul0sPPfSQe5srrrhCf//73zV79mzt3LlTs2bN0uTJk3X11Vef8fPzNA8++KBsNpu6d++uiIiIk878N3nyZLVo0ULnnnuurrjiCg0bNkx9+/at13oiIiI0Y8YM/fe//1X37t313HPPHTfhQ8uWLfXdd9+poKBAF1xwgfr166e33nrL/SYfNWqUpkyZoldffVU9evTQ5Zdfri1btrj3nzZtmsrLy9WvXz/dd999euaZZ2pUW03O/7XXXtM111yju+66S127dtWYMWPcXRGPuPXWW1VWVuZ+TwMAADRn5U6XlmzN0cOz0jTg2W9101u/6L1lu5VTUKpgu5eu6ddW05MTtez/LtQtnVwKC/Axu+RasRgm3133lVde0b/+9S9lZGQoPj5eL730kgYMGCBJuvDCC9W+fXvNmDFDkrR48WLdeeed2r59uwIDA5WUlKTnnntOrVu3dh8vPz9fjz32mGbNmqWsrCy1bt1aN954ox5//HH5+NTsh5OXl6eQkBDl5uZW2y1wx44d6tChwxnpunVkLFBwcPAZaSlD/frxxx91ySWXaM+ePcdN3nKsM/3eAnBqDodDc+bMUVJSEi1XAFBH5U6Xlm6vaKH6Zl2mDhSWudeF+nvr0u6RSoqL1rmx4fLxqvi860nX35Nlg2OZHq48EeEKp6u0tFTZ2dkaNWqUoqKi9P77759yH8IV4Hk86Zc7ADQmDqdLP2/br7lp6fpmXYYOFh2dca+Fv7eG9YhSUly0Bsa2lLft+M+4nnT9rU24alSzBQKNxYcffqhbb71V8fHxevfdd80uBwAAoMGVlbu0ZFuO5qala/76TB2qFKjCAnw0rEeURsRF65yOYfKqJlA1BYQroAEkJycrOTnZ7DIAAAAaVFm5Sz9tzdactAzNX5ehvJKjt5MJDzwaqPp3aLqBqjLCFQAAAIAaKy136sfNOZqzNl0L1mcqv0qg8tXwnhVd/vp3CJPNenq3EmpsCFcAAAAATqrE4dQPm7M1d22Gvl2fqfzSo4GqVdDRQJXQvvkFqsoIVwAAAACOU+JwatGmbM1dm66FG7JUUClQRQb7anjPaI3oFa1+7VrI2owDVWWEKwAAAACSpOIypxZvztLstAx9tyFThWVO97roEPvhQBWlPjEEquoQrgAAAIBmrKisXIs2ZWt2Wrq+35ilokqBqk2oX0WXv17Rim8bSqA6BcIVAAAA0MwUlZXru41ZmpOWru83ZqvYUTVQjegVraS4aPVuGyKLhUBVU4Qr1Er79u1133336b777pMkWSwWzZo1S1dddVW12+/cuVMdOnTQ6tWrFR8ff8bqBAAAQFWFpeVauDFLc35L16LNWSpxuNzrYsL8lBQXraSe0epFoKozwhVOS3p6ulq0aGF2GQAAAKhGfolD323M0uzf0rV4c7ZKy48GqrNa+rsDVc82wQSqekC4wmmJiooyu4R6ZxiGnE6nvLz47wEAABqfvBKHFm7I1OzfMvTDlmyVVQpUHcIDlBQXpeE9o9WjNYGqvjX92yRDkvTmm2+qdevWcrlcVZZfeeWVGj16tCRp27ZtuvLKKxUZGanAwEAlJibq22+/PelxLRaLvvjiC/fj5cuXq0+fPrLb7UpISNDq1atPWdvMmTOVkJCgoKAgRUVF6aabblJWVlaVbdatW6fLL79cwcHBCgoK0vnnn69t27a510+bNk09evSQr6+voqOjNXbsWEkV3RItFovWrFnj3vbQoUOyWCxatGiRJGnRokWyWCyaO3eu+vXrJ19fX/300081ej1KS0v1f//3f4qJiZGvr686deqkt99+W4ZhqFOnTvr3v/9dZfs1a9bIYrFo69atp3xdAAAAaiq32KHPVv6uW2ekKuHpb3X/x7/q2w2ZKit3qWNEgO65uJPm/PV8fffABfrbsK7q2Yaufw2BP83XB8OQHEUNc2yXq+LYZTbJekwW9vaXavif4tprr9U999yj77//Xpdccokk6cCBA5o3b57mzJkjSSooKFBSUpL+/ve/y9fXV++++66uuOIKbdq0Se3atTvlcxQUFOjyyy/X0KFD9d5772nHjh269957T7mfw+HQ008/rS5duigrK0vjxo1TcnKyu669e/dq8ODBuvDCC/Xdd98pODhYS5YsUXl5xb0WXnvtNY0bN07PPfechg8frtzcXC1ZsqRGr0tl48eP17///W917NhRLVq00J49e075eowcOVJLly7VSy+9pN69e2vHjh3KycmRxWLR6NGjNX36dD344IPu55g+fboGDx6sTp061bo+AACAynKLHJq/PkNz12boxy3ZcjgN97pOrQIruvzFRalLZBBB6gwhXNUHR5H0bOsGObRVUuiJVj68T/IJqNFxWrRooeHDh+uDDz5wh6tPP/1U4eHhuuiiiyRJvXv3Vu/evd37PP3005o1a5a++uord0vQyXzwwQdyuVx6++23Zbfb1aNHD/3++++68847T7rfkZYzSerYsaNeeuklJSYmqqCgQIGBgZo6dapCQkL00UcfydvbW5J09tlnu/d55pln9MADD1QJcomJiTV4VaqaOHGihg4d6n4cFhZ20tdj8+bN+uSTT7RgwQINGTLEXf8RycnJevzxx7V8+XL1799fDodDH3zwwXGtWQAAADV1qKhM89dlas7adC3ZmlMlUJ0dGei+se/ZkUEmVtl8Ea6akZtvvlljxozRq6++Kl9fX73//vu64YYbZD3cIlZQUKAnn3xSs2fPVnp6usrLy1VcXKzdu3fX6PgbNmxQr169ZLfb3csGDhx4yv1WrlypJ598Ur/++qsOHjzo7rq4e/dude/eXWvWrNH555/vDlaVZWVlad++fe7AeDoSEhKqPD7V67FmzRrZbDZdcMEF1R6vdevWGjFihKZNm6b+/fvrf//7n0pLS3Xttdeedq0AAKD5OFBYpvnrMjRnbYZ+3pqjctfRQNU1Ksh9Y99OrQhUZiNc1Qdv/4pWpAbgcrmUl5+v4KAgdwiq8ry1cMUVV8gwDM2ePVuJiYn68ccf9cILL7jXP/jgg1qwYIH+/e9/q1OnTvLz89M111yjsrKy+jiVahUWFmrYsGEaNmyY3n//fUVERGj37t0aNmyY+3n9/PxOuP/J1klyv2aGcfQi5HA4qt02IKBqK+CpXo9TPbck3Xbbbfrzn/+sF154QdOnT9f1118vf//a/dwAAEDzs7+gVN+sy9Tcten6edt+OSsFqm7RwUo6fGPf2IhAE6vEsQhX9cFiqXH3vFpzuSRvZ8Xxjw1XtWS32/XHP/5R77//vrZu3aouXbqob9++7vVLlixRcnKyrr76akkVLTc7d+6s8fG7deummTNnqqSkxN16tWzZspPus3HjRu3fv1/PPfecYmJiJEkrVqyosk2vXr30zjvvyOFwHNd6FRQUpPbt22vhwoXu7o2VRURESKqYMr5Pnz6SVGVyi5M51esRFxcnl8ulxYsXu7sFHispKUkBAQF67bXXNG/ePP3www81em4AAND85BSUat7aDM1dm65l2w9UCVTdo4M1ole0hveMUkcClcciXDUzN998sy6//HKtW7dOt9xyS5V1nTt31ueff64rrrhCFotFjz322HGzC57MTTfdpEceeURjxozRhAkTtHPnzlOOL2rXrp18fHz08ssv64477tDatWv19NNPV9lm7Nixevnll3XDDTdowoQJCgkJ0bJly9S/f3916dJFTz75pO644w61atVKw4cPV35+vpYsWaJ77rlHfn5+Ouecc/Tcc8+pQ4cOysrK0qOPPlqj8znV69G+fXuNGjVKo0ePdk9osWvXLmVlZem6666TJNlsNiUnJ2vChAnq3LlzjbpJAgCA5iMrv0TfrM3QnLQM/bJjvyrlKfVsE+y+D1X78Ab6Qz7qFVOxNzMXX3yxwsLCtGnTJt10001V1k2ePFktWrTQueeeqyuuuELDhg2r0rJ1KoGBgfrf//6ntLQ09enTR4888oj+8Y9/nHSfiIgIzZgxQ//973/VvXt3Pffcc8cFspYtW+q7775TQUGBLrjgAvXr109vvfWWuxVr1KhRmjJlil599VX16NFDl19+ubZs2eLef9q0aSovL1e/fv10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SZMm6d1339Xrr7+udevW6f7779ctt9yixYsXu7f529/+pueff16pqamKiIjQFVdcIYfDIakiFF133XW64YYblJaWpieffFKPPfaYZsyY4d5/5MiR+vDDD/XSSy9pw4YNeuONNxQYGFiljkceeUTPP/+8VqxYIS8vL40ePfqMnD8AwDwWwzAMs4sAAKA+lJaWKiwsTN9++60GDhzoXn7bbbepqKhIt99+uy666CJ99NFHuv766yVJBw4cUNu2bTVjxgxdd911uvnmm5Wdna358+e793/ooYc0e/ZsrVu3Tps3b1aXLl20YMECDRky5LgaFi1apIsuukjffvutLrnkEknSnDlzNGLECBUXF8tutzfwqwAAMAstVwCAJmPr1q0qKirS0KFDFRgY6P569913tW3bNvd2lYNXWFiYunTpog0bNkiSNmzYoEGDBlU57qBBg7RlyxY5nU6tWbNGNptNF1xwwUlr6dWrl/vf0dHRkqSsrKzTPkcAgOfyMrsAAADqS0FBgSRp9uzZatOmTZV1vr6+VQJWXfn5+dVoO29vb/e/LRaLpIrxYACApouWKwBAk9G9e3f5+vpq9+7d6tSpU5WvmJgY93bLli1z//vgwYPavHmzunXrJknq1q2blixZUuW4S5Ys0dlnny2bzaa4uDi5XK4qY7gAAJBouQIANCFBQUF68MEHdf/998vlcum8885Tbm6ulixZouDgYJ111lmSpIkTJ6ply5aKjIzUI488ovDwcF111VWSpAceeECJiYl6+umndf3112vp0qV65ZVX9Oqrr0qS2rdvr1GjRmn06NF66aWX1Lt3b+3atUtZWVm67rrrzDp1AIAHIFwBAJqUp59+WhEREZo0aZK2b9+u0NBQ9e3bVw8//LC7W95zzz2ne++9V1u2bFF8fLz+97//ycfHR5LUt29fffLJJ3r88cf19NNPKzo6WhMnTlRycrL7OV577TU9/PDDuuuuu7R//361a9dODz/8sBmnCwDwIMwWCABoNo7M5Hfw4EGFhoaaXQ4AoIlhzBUAAAAA1APCFQAAAADUA7oFAgAAAEA9oOUKAAAAAOoB4QoAAAAA6gHhCgAAAADqAeEKAAAAAOoB4QoAAAAA6gHhCgAAAADqAeEKAAAAAOoB4QoAAAAA6gHhCgAAAADqwf8DzmXPudzbf9cAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure(figsize=(10, 6))\n",
    "ax = fig.add_subplot(1, 1, 1)\n",
    "ax.plot(metrics[\"train_accs\"], label=\"train accuracy\")\n",
    "ax.plot(metrics[\"valid_accs\"], label=\"valid accuracy\")\n",
    "ax.set_xlabel(\"epoch\")\n",
    "ax.set_ylabel(\"loss\")\n",
    "ax.set_xticks(range(n_epochs))\n",
    "ax.legend()\n",
    "ax.grid()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "c9f36818",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "evaluating...: 100%|████████████████████████| 3125/3125 [03:26<00:00, 15.17it/s]\n"
     ]
    }
   ],
   "source": [
    "model.load_state_dict(torch.load(\"transformer.pt\"))\n",
    "\n",
    "test_loss, test_acc = evaluate(test_data_loader, model, criterion, device)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "b1f14079",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "test_loss: 0.177, test_acc: 0.933\n"
     ]
    }
   ],
   "source": [
    "print(f\"test_loss: {test_loss:.3f}, test_acc: {test_acc:.3f}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "fca30739",
   "metadata": {},
   "outputs": [],
   "source": [
    "def predict_sentiment(text, model, tokenizer, device):\n",
    "    ids = tokenizer(text)[\"input_ids\"]\n",
    "    tensor = torch.LongTensor(ids).unsqueeze(dim=0).to(device)\n",
    "    prediction = model(tensor).squeeze(dim=0)\n",
    "    probability = torch.softmax(prediction, dim=-1)\n",
    "    predicted_class = prediction.argmax(dim=-1).item()\n",
    "    predicted_probability = probability[predicted_class].item()\n",
    "    return predicted_class, predicted_probability"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "bd35e378",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0, 0.9912357330322266)"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "text = \"This film is terrible!\"\n",
    "\n",
    "predict_sentiment(text, model, tokenizer, device)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "b53900c7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1, 0.9822028875350952)"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "text = \"This film is great!\"\n",
    "\n",
    "predict_sentiment(text, model, tokenizer, device)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "ad677cd1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1, 0.9886888861656189)"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "text = \"This film is not terrible, it's great!\"\n",
    "\n",
    "predict_sentiment(text, model, tokenizer, device)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "e7c35353",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0, 0.9897234439849854)"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "text = \"This film is not great, it's terrible!\"\n",
    "\n",
    "predict_sentiment(text, model, tokenizer, device)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
